package ar.republicagroup.gestion.util.exportar;

import ar.republicagroup.gestion.entities.Caja;
import ar.republicagroup.gestion.util.exportar.beans.LiquidacionBean;
import ar.republicagroup.gestion.util.helpers.Formato;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.CellStyle;

public class Exportar {
    
    private static Logger log = Logger.getLogger(Exportar.class);
    
    
    /* CONSTANTES  -> cajaDiariaToXLS */
    private static final int INITIAL_CAJA_DIARIA_ROW = 3;
    private static final int RETIRO_BANCO_COLUMN     = 0;
    private static final int RETIRO_IMPORTE_COLUMN   = 1;
    private static final int PAGO_CLIENTE_COLUMN     = 2;
    private static final int PAGO_IMPORTE_COLUMN     = 3;
    private static final int GASTODIARIO_CONCEPTO_COLUMN = 4;
    private static final int GASTODIARIO_IMPORTE_COLUMN  =  5;
    private static final int GASTOBANCO_BANCO_COLUMN    = 6;
    private static final int GASTOBANCO_IMPORTE_COLUMN  = 7;
    
    
    public static void toPDF(InputStream file, List<LiquidacionBean> datos, Map param,String title) throws Exception {
           
            log.info("Generando reportePDF...");
                     
            JRBeanCollectionDataSource data;
            data = new JRBeanCollectionDataSource(datos);
                                
            //Usando el archivo JASPER (compilado)
            JasperReport rep = (JasperReport) JRLoader.loadObject(file);
            JasperPrint print = JasperFillManager.fillReport(rep, param, data);
                       
            //Creando y Visualizando PDF
            JasperViewer viewer = new JasperViewer(print, false);
            viewer.setTitle(title);
            viewer.setVisible(true);
            
            log.info("Reporte generado!");
            
    }
 
    public static boolean cajaDiariaToXLS(Map<String,Object> mapCierreDeCaja){
       
        boolean exportSuccess = false;
        
        try
        {
          log.info("Exportando cajaDiariaToXLS ..."); 
          String rutaExportacion = mapCierreDeCaja.get("absolutePathXLS").toString();
          InputStream inputStream = Exportar.class.getClassLoader().getResourceAsStream("ar/republicagroup/gestion/util/excel/CajaDiariaTemplate.xlt");  
          POIFSFileSystem fs = new POIFSFileSystem(inputStream);
          HSSFWorkbook workbook = new HSSFWorkbook(fs);
          
          HSSFCellStyle style1 = workbook.createCellStyle();
          style1.setBorderLeft(CellStyle.BORDER_MEDIUM);
          style1.setBorderRight(CellStyle.BORDER_MEDIUM);
          
          HSSFCellStyle style2 = workbook.createCellStyle();
          style2.setBorderLeft(CellStyle.BORDER_MEDIUM);
          style2.setBorderRight(CellStyle.BORDER_MEDIUM);
          style2.setBorderTop(CellStyle.BORDER_MEDIUM);
          style2.setBorderBottom(CellStyle.BORDER_MEDIUM);
          
          
          HSSFSheet sheet = workbook.getSheetAt(0);
          /*SimpleDateFormat spanishFormat = new SimpleDateFormat("dd-MMMM-yyyy");*/
          
          int currentRow = INITIAL_CAJA_DIARIA_ROW;
          
          /* Obtenemos los movimientos */
          List<Caja> retiros        = (List<Caja>) mapCierreDeCaja.get("retiros");
          List<Caja> pagos          = (List<Caja>) mapCierreDeCaja.get("pagos");
          List<Caja> gastosDiarios  = (List<Caja>) mapCierreDeCaja.get("gastosDiarios");
          List<Caja> gastosBancos   = (List<Caja>) mapCierreDeCaja.get("gastosBanco");
          
          /* Obtenemos los totales */
          double totalEfecCajaDia   = Double.parseDouble(mapCierreDeCaja.get("totalEfecCajaDia").toString());
          double totalEfecCajaAnt   = Double.parseDouble(mapCierreDeCaja.get("totalEfecCajaAnt").toString());
          double totalRetiros       = Double.parseDouble(mapCierreDeCaja.get("totalRetiros").toString());
          double totalPagos         = Double.parseDouble(mapCierreDeCaja.get("totalPagos").toString());
          double totalGastosDiarios = Double.parseDouble(mapCierreDeCaja.get("totalGastosDiarios").toString());
          double totalGastosBancos  = Double.parseDouble(mapCierreDeCaja.get("totalGastosBancos").toString()); 
          
                   
          for( Caja movimiento : retiros ){
            writeRow(sheet, currentRow, RETIRO_BANCO_COLUMN, movimiento.getCuentaBancoId().getNombre(), 
                   RETIRO_IMPORTE_COLUMN, movimiento.getImporte().doubleValue() ,style1);   
           currentRow++;
          }
          
          currentRow = INITIAL_CAJA_DIARIA_ROW;
          
          for( Caja movimiento : pagos ){
            writeRow(sheet,currentRow,PAGO_CLIENTE_COLUMN,movimiento.getClienteId().getNombre(),
                    PAGO_IMPORTE_COLUMN,movimiento.getImporte().doubleValue() ,style1 );
            currentRow++;
          }
          
          currentRow = INITIAL_CAJA_DIARIA_ROW;
          
          for( Caja movimiento : gastosDiarios ){
             writeRow( sheet,currentRow,GASTODIARIO_CONCEPTO_COLUMN,movimiento.getDescripcion(),
                   GASTODIARIO_IMPORTE_COLUMN,movimiento.getImporte().doubleValue(),style1 ); 
             currentRow++; 
          }
          
          currentRow = INITIAL_CAJA_DIARIA_ROW;
          
          for( Caja movimiento : gastosBancos ){
             writeRow( sheet,currentRow,GASTOBANCO_BANCO_COLUMN,movimiento.getCuentaBancoId().getNombre(),
                   GASTOBANCO_IMPORTE_COLUMN,movimiento.getImporte().doubleValue(),style1 ); 
             currentRow++; 
          }
          
         sheet.autoSizeColumn(RETIRO_BANCO_COLUMN);
         sheet.autoSizeColumn(PAGO_CLIENTE_COLUMN);
         sheet.autoSizeColumn(GASTODIARIO_CONCEPTO_COLUMN);
         sheet.autoSizeColumn(GASTOBANCO_BANCO_COLUMN);
         
          /* Mostramos los totales */
          writeRow(sheet,18,1,Formato.decimalComaMilesConSigno(totalRetiros),style2);
          writeRow(sheet,18,3,Formato.decimalComaMilesConSigno(totalPagos),style2);
          writeRow(sheet,18,5,Formato.decimalComaMilesConSigno(totalGastosDiarios),style2);
          writeRow(sheet,18,7,Formato.decimalComaMilesConSigno(totalGastosBancos),style2);
          
          writeRow(sheet,20,2,Formato.decimalComaMilesConSigno(totalEfecCajaAnt),style2 );
          writeRow(sheet, 22, 2, Formato.decimalComaMilesConSigno(totalEfecCajaDia) ,style2);
         
          FileOutputStream fileout = new FileOutputStream(rutaExportacion);
          workbook.write(fileout);
          fileout.close();
          log.info("Exportacion correcta!");
          exportSuccess = true;
        }catch (Exception ex) {
          log.info("Se produjo un error al exportar...");
          log.error(ex.getMessage(), ex);
        }
        
        return exportSuccess;

    }
    
   
    private static void writeRow(HSSFSheet sheet,int currentRow, 
            int infoColumnIndex, String infoColumnValue, 
            int importeColumnIndex, double importeValue, HSSFCellStyle style){
    
         HSSFRow selectedRow         = sheet.getRow(currentRow);
         HSSFCell informationColumn  = selectedRow.createCell( infoColumnIndex );
         informationColumn.setCellValue( infoColumnValue );
         informationColumn.setCellStyle(style);
          
         HSSFCell importeColumn       =  selectedRow.createCell( importeColumnIndex );
         String importeRetiro         = Formato.decimalComaMilesConSigno(importeValue);
         importeColumn.setCellValue( importeRetiro );
         importeColumn.setCellStyle(style);

    }
    
    private static void writeRow(HSSFSheet sheet,int rowIndex,int columnIndex,String cellValue,HSSFCellStyle style){
    
        HSSFRow selectedRow         = sheet.getRow(rowIndex);
        HSSFCell selectedColumn     = selectedRow.createCell( columnIndex );
        selectedColumn.setCellValue(cellValue);
        selectedColumn.setCellStyle(style);
        
    }
 
    
}
